#include "sequeue.h"

//1.创建一个空的队列
sequeue_t *CreateEmptySequeue()
{
	sequeue_t* p = (sequeue_t*)malloc(sizeof(sequeue_t));//动态内存分配
	if (NULL==p)
	{
		printf("开辟失败!\n");
		return NULL;
	}
	p->front = p->rear = 0;//初始化
	return p;
}

//2.入列 data代表入列的数据
int InSequeue(sequeue_t *p, datatype data)
{
	if (NULL==p)//合法性判断
	{
		printf("传入队列错误!\n");
		return -1;
	}
	p->data[p->rear] = data;//入列操作
	p->rear = (p->rear + 1) % SEQUEUE_SIZE;
	return 0;
}

//3.判断队列是否为满,已满返回1，未满返回0
int IsFullSequeue(const sequeue_t *p)
{
	if (NULL==p)//合法性判断
	{
		printf("传入队列错误!\n");
		return -1;
	}
	return ((p->rear + 1) % SEQUEUE_SIZE == p->front);
}

//4.判断队列是否为空,为空返回1，不为空返回0
int IsEmptySequeue(const sequeue_t *p)
{
	if (NULL == p)//合法性判断
	{
		printf("传入队列错误!\n");
		return -1;
	}
	return (p->rear == p->front);
}

//5.出列
datatype OutSequeue(sequeue_t *p)
{
	if (NULL == p)//合法性判断
	{
		printf("传入队列错误!\n");
		exit(-1);
	}
	datatype temp = p->data[p->front];//出列操作
	p->front = (p->front + 1) % 5;
	return temp;
}

//6.求队列的长度
int LengthSequeue(const sequeue_t *p)
{
	if (NULL == p)//合法性判断
	{
		printf("传入队列错误!\n");
		exit(-1);
	}
	int len = 0;//定义长度
	if (p->rear>=p->front)//如果尾大于等于头
	{
		len = (p->rear) - (p->front);
	}
	else//如果尾小于头
	{
		len = (p->rear) + 5 - (p->front);
	}
	return len;
}

//7.清空队列函数
void ClearSequeue(sequeue_t *p)
{
	if (NULL == p)//合法性判断
	{
		printf("传入队列错误!\n");
		return;
	}
	p->front = p->rear = 0;
}